package slidingWindow;

public class LongestOne {
    public int longestSubarray(int[] nums) {
        int maxLength = 0; // 1的最大长度
        int currLength = 0; // 当前1的长度
        int prevLength = 0; // 之前1的长度
        boolean hasZero = false; // 是否存在0
        for (int num : nums) {
            if (num == 1) {
                currLength++;
            } else {
                hasZero = true;
                maxLength = Math.max(maxLength, prevLength); // 更新最大长度
                prevLength = currLength; // 更新之前1的长度
                currLength = 0; // 重置当前1的长度
            }
        }
        if (!hasZero) {
            return currLength - 1; // 如果数组中没有0，则返回数组长度-1
        }
        return Math.max(maxLength, prevLength + currLength);
    }

    public int longestSubarray2(int[] nums) {
        int maxOnesCount = 0; // 最长的只包含1的子数组的长度
        int left = 0; // 左指针
        int zeroCount = 0; // 记录0的个数

        for (int right = 0; right < nums.length; right++) {
            if (nums[right] == 0) {
                zeroCount++;
            }

            while (zeroCount > 1) {
                if (nums[left] == 0) {
                    zeroCount--;
                }
                left++;
            }

            maxOnesCount = Math.max(maxOnesCount, right - left);
        }

        return maxOnesCount;
    }

    public static void main(String[] args) {
        int[] nums = {1, 1, 1, 1};
        LongestOne solution = new LongestOne();
        int result = solution.longestSubarray2(nums);
        System.out.println(result);  // 输出 3
    }
}
